(function($) {
    $.fn.countTo = function(options) {
        // merge the default plugin settings with the custom options
        options = $.extend({}, $.fn.countTo.defaults, options || {});

        // how many times to update the value, and how much to increment the value on each update
        var loops = Math.ceil(options.speed / options.refreshInterval),
                increment = (options.to - options.from) / loops;

        return $(this).each(function() {
            var _this = this,
                    loopCount = 0,
                    value = options.from,
                    interval = setInterval(updateTimer, options.refreshInterval);

            function updateTimer() {
                value += increment;
                loopCount++;
                $(_this).html(value.toFixed(options.decimals));

                if (typeof (options.onUpdate) === 'function') {
                    options.onUpdate.call(_this, value);
                }

                if (loopCount >= loops) {
                    clearInterval(interval);
                    value = options.to;

                    if (typeof (options.onComplete) === 'function') {
                        options.onComplete.call(_this, value);
                    }
                }
            }
        });
    };

    $.fn.countTo.defaults = {
        from: 0, // the number the element should start at
        to: 100, // the number the element should end at
        speed: 1000, // how long it should take to count between the target numbers
        refreshInterval: 100, // how often the element should be updated
        decimals: 0, // the number of decimal places to show
        onUpdate: null, // callback method for every time the element is updated,
        onComplete: null  // callback method for when the element finishes updating
    };

    //initToCounter
    $(document).ready(function() {
        if ($('.counter.type1').length) {
            $('.counter.type1').each(function() {
                var delay = $(this).data('delay');
                var time = 0;

                if (delay !== "" && delay !== 0) {
                    time = delay;
                }

                var $this = $(this);
                if ($('.touch .no_delay').length) {
                    $this.parent().css('opacity', '1');
                    var $max = parseFloat($this.text());
                    $this.countTo({
                        from: 0,
                        to: $max,
                        speed: 1500,
                        refreshInterval: 50
                    });
                    resizeFonts();
                } else {
                    $this.appear(function() {
                        setTimeout(function() {
                            $this.parent().css('opacity', '1');
                            var $max = parseFloat($this.text());
                            $this.countTo({
                                from: 0,
                                to: $max,
                                speed: 1500,
                                refreshInterval: 50
                            });
                            resizeFonts();
                        }, time);
                    }, {accX: 0, accY: -200});
                }
            });
        }
    });

    //initRandomCounter
    $(document).ready(function() {
        if ($('.counter.type2').length) {
            $('.counter.type2').each(function() {

                var delay = $(this).data('delay');
                var time = 0;

                if (delay !== "" && delay !== 0) {
                    time = delay;
                }

                var $this = $(this);

                if ($('.touch .no_delay').length) {
                    $this.parent().css('opacity', '1');
                    $this.absoluteCounter({
                        speed: 2000,
                        fadeInDelay: 1000
                    });
                    resizeFonts();
                } else {
                    $this.appear(function() {
                        setTimeout(function() {
                            $this.parent().css('opacity', '1');
                            $this.absoluteCounter({
                                speed: 2000,
                                fadeInDelay: 1000
                            });
                            resizeFonts();
                        }, time);
                    }, {accX: 0, accY: -200});
                }
            });
        }
    });
})(jQuery);